# bash completion for Postgresql                           -*- shell-script -*-

_pg_databases()
{
    # -w was introduced in 8.4, https://launchpad.net/bugs/164772
    # "Access privileges" in output may contain linefeeds, hence the NF > 1
    COMPREPLY=($(compgen -W "$(psql -XAtqwlF $'\t' 2>/dev/null |
        awk 'NF > 1 { print $1 }')" -- "$cur"))
}

_pg_users()
{
    # -w was introduced in 8.4, https://launchpad.net/bugs/164772
    COMPREPLY=($(compgen -W "$(psql -XAtqwc 'select usename from pg_user' \
        template1 2>/dev/null)" -- "$cur"))
    ((${#COMPREPLY[@]} == 0)) && COMPREPLY=($(compgen -u -- "$cur"))
}

# createdb(1) completion
#
_createdb()
{
    local cur prev words cword split
    _init_completion -s || return

    case $prev in
        --host | -!(-*)h)
            _known_hosts_real -- "$cur"
            return
            ;;
        --username | --owner | -!(-*)[UO])
            _pg_users
            return
            ;;
        --help | --version | --port | --tablespace | --encoding | --template | \
            -!(-*)[pDET])
            return
            ;;
    esac

    $split && return

    if [[ $cur == -* ]]; then
        COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur"))
        [[ ${COMPREPLY-} == *= ]] && compopt -o nospace
    else
        _pg_databases
    fi
} &&
    complete -F _createdb createdb

# createuser(1) completion
#
_createuser()
{
    local cur prev words cword split
    _init_completion -s || return

    case $prev in
        --help | --version | --port | --connection-limit | -!(-*)[pc])
            return
            ;;
        --host | -!(-*)h)
            _known_hosts_real -- "$cur"
            return
            ;;
        --username | -!(-*)U)
            _pg_users
            return
            ;;
    esac

    $split && return

    if [[ $cur == -* ]]; then
        COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur"))
        [[ ${COMPREPLY-} == *= ]] && compopt -o nospace
    fi
} &&
    complete -F _createuser createuser

# dropdb(1) completion
#
_dropdb()
{
    local cur prev words cword split
    _init_completion -s || return

    case $prev in
        --host | -!(-*)h)
            _known_hosts_real -- "$cur"
            return
            ;;
        --username | -!(-*)U)
            _pg_users
            return
            ;;
        --help | --version)
            return
            ;;
    esac

    $split && return

    if [[ $cur == -* ]]; then
        COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur"))
        [[ ${COMPREPLY-} == *= ]] && compopt -o nospace
    else
        _pg_databases
    fi
} &&
    complete -F _dropdb dropdb

# dropuser(1) completion
#
_dropuser()
{
    local cur prev words cword split
    _init_completion -s || return

    case $prev in
        --help | --version | --port | -!(-*)p)
            return
            ;;
        --host | -!(-*)h)
            _known_hosts_real -- "$cur"
            return
            ;;
        --username | -!(-*)U)
            _pg_users
            return
            ;;
    esac

    $split && return

    if [[ $cur == -* ]]; then
        COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur"))
        [[ ${COMPREPLY-} == *= ]] && compopt -o nospace
    else
        _pg_users
    fi
} &&
    complete -F _dropuser dropuser

# psql(1) completion
#
_psql()
{
    local cur prev words cword split
    _init_completion -s || return

    case $prev in
        --host | -!(-*)h)
            _known_hosts_real -- "$cur"
            return
            ;;
        --username | -!(-*)U)
            _pg_users
            return
            ;;
        --dbname | -!(-*)d)
            _pg_databases
            return
            ;;
        --output | --file | --log-file | -!(-*)[ofL])
            _filedir
            return
            ;;
        --help | --version | --command | --field-separator | --port | --pset | \
            --record-separator | --table-attr | --set | --variable | \
            -!(-*)[?VcFpPRTv])
            return
            ;;
    esac

    $split && return

    if [[ $cur == -* ]]; then
        # return list of available options
        COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur"))
        [[ ${COMPREPLY-} == *= ]] && compopt -o nospace
    else
        # return list of available databases
        _pg_databases
    fi
} &&
    complete -F _psql psql

# ex: filetype=sh
